/**
 * 0015
 *
 * @Author : Ruoyu Wang
 * @DateTime : 2024/8/12 23:00
 */

#include <iostream>
#include <vector>
#include "algorithm"

using namespace std;

class Solution {
public:
    vector<vector<int>> threeSum(vector<int> &nums) {
        sort(nums.begin(), nums.end());
        vector<vector<int>> res;
        for (int i = 0; i < nums.size() - 2; ++i) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            int l = i + 1, r = nums.size() - 1;
            while (l < r) {
                if (nums[i] + nums[l] + nums[r] < 0) {
                    l++;
                } else if (nums[i] + nums[l] + nums[r] > 0) {
                    r--;
                } else {
                    res.push_back({nums[i], nums[l], nums[r]});
                    l++, r--;
                    while (l < r && nums[l] == nums[l - 1]) l++;
                    while (l < r && nums[r] == nums[r + 1]) r--;
                }
            }
        }
        return res;
    }
};

//class Solution {
//public:
//    // 双指针法处理三数之和
//    vector<vector<int>> threeSum(vector<int> &nums) {
//        sort(nums.begin(), nums.end());
//        vector<vector<int>> res;
//        for (int i = 0; i < nums.size() - 2; ++i) {
//            if (i > 0 && nums[i] == nums[i - 1]) continue;
//            int l = i + 1;
//            int r = nums.size() - 1;
//            while (l < r) {
//                if (nums[i] + nums[l] + nums[r] > 0) {
//                    r--;
//                } else if (nums[i] + nums[l] + nums[r] < 0) {
//                    l++;
//                } else {
//                    res.push_back({nums[i], nums[l], nums[r]});
//                    l++;
//                    r--;
//                    while (l < r && l > i + 1 && nums[l] == nums[l - 1]) l++;
//                    while (l < r && r < nums.size() - 1 && nums[r] == nums[r + 1]) r--;
//                }
//            }
//        }
//        return res;
//    }
//};

int main() {

    return 0;
}